package ar.com.ctrln.view.dashboard.administracion.liquidacion;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.administracion.liquidaciones.RegistrarLiquidacion;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.liquidacion.Liquidacion;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ClientesLiquidacionController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7770521029446566296L;

	@WireVariable
	private RegistrarLiquidacion registrarLiquidacion;

	@Wire
	private Window wListarClientesLiquidacion;

	@Wire
	private Datebox fechaDesde;

	@Wire
	private Datebox fechaHasta;

	@Wire
	private Button btnGenerarLiquidacion;

	@Wire
	private Button btVerPeriodo;

	@Wire
	private Listbox lbClientes;

	private ListModelList<Cliente> modeloClientes;

	private Liquidacion liquidacion;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		fechaHasta.setConstraint(new Constraint() {

			@Override
			public void validate(Component comp, Object value) {
				Date fin = (Date) value;

				if (fin.before(fechaDesde.getValue())) {

					Clients.showNotification("Modifique la fecha", fechaDesde);
					throw new WrongValueException(comp, "Error en fecha");
				}

			}
		});

		fechaDesde.addEventListener("onChange", new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {

				liquidacion = null;

				Date date = fechaDesde.getValue();

				Calendar calendar = Calendar.getInstance(Locale.getDefault());
				calendar.setTime(date);
				calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);

				fechaHasta.setValue(calendar.getTime());
				calendar.setTime(date);

				if (liquidacion == null) {
					liquidacion = registrarLiquidacion.buscarLiquidacion(
							calendar.get(Calendar.MONTH) + 1,
							calendar.get(Calendar.YEAR));
					if (liquidacion != null)
						Clients.showNotification("El periodo de Liquidacion seleccionado se encuentra abierto y en estado pendiente de facturar");
					else {
						liquidacion = new Liquidacion();
						liquidacion.setFechaDesde(fechaDesde.getValue());
						liquidacion.setFechaHasta(fechaHasta.getValue());
						liquidacion.setMes(calendar.get(Calendar.MONTH) + 1);
						liquidacion.setAnio(calendar.get(Calendar.YEAR));
						liquidacion.setTotalEgreso(0);
						liquidacion.setTotalIngreso(0);
						registrarLiquidacion.nueva(liquidacion);
					}
				} else {
					liquidacion = new Liquidacion();
					liquidacion.setFechaDesde(fechaDesde.getValue());
					liquidacion.setFechaHasta(fechaHasta.getValue());
					liquidacion.setMes(calendar.get(Calendar.MONTH) + 1);
					liquidacion.setAnio(calendar.get(Calendar.YEAR));
					liquidacion.setTotalEgreso(0);
					liquidacion.setTotalIngreso(0);
					registrarLiquidacion.nueva(liquidacion);
				}
			}
		});

		modeloClientes = new ListModelList<Cliente>();

		modeloClientes.addAll(registrarLiquidacion.listarClientes());

		lbClientes.setModel(modeloClientes);
	}

	@Listen("onClick = #btnGenerarLiquidacion")
	public void generarLiquidacionCliente() {
		if (lbClientes.getSelectedItem() == null) {
			Clients.showNotification("Seleccione un Cliente", lbClientes);
		} else {
			Cliente cliente = lbClientes.getSelectedItem().getValue();
			wListarClientesLiquidacion.setAttribute("cliente", cliente);
			wListarClientesLiquidacion.setAttribute("liquidacion", liquidacion);
			Executions
					.createComponents(
							"/zul/administracion/consumo/liquidacion/generarLiquidacion.zul",
							wListarClientesLiquidacion, null);
		}

	}

	@Listen("onClick = #btVerPeriodo")
	public void verPeriodoLiquidacion() {
		wListarClientesLiquidacion.setAttribute("liquidacion", liquidacion);
		Executions
				.createComponents(
						"/zul/administracion/consumo/liquidacion/verLiquidacionPeriodo.zul",
						wListarClientesLiquidacion, null);

	}

}
